Java.lang প্যাকেজ Java প্রোগ্রামিং ল্যাঙ্গুয়েজের একটি গুরুত্বপূর্ণ প্যাকেজ, যা খুবই সাধারণ এবং প্রয়োজনীয় ক্লাস এবং ইন্টারফেস অন্তর্ভুক্ত করে। এই প্যাকেজে থাকা clone() মেথড এবং Cloneable ইন্টারফেস Java-তে অবজেক্ট ক্লোনিংয়ের জন্য ব্যবহৃত হয়।
clone() মেথড:
clone() মেথড হল Object ক্লাসের একটি মেথড যা একটি অবজেক্টের শ্যালো কপি (shallow copy) তৈরি করে। যখন আপনি একটি অবজেক্ট ক্লোন করতে চান, তখন clone() মেথডটি সেই অবজেক্টের একটি নতুন কপি তৈরি করে, যার প্যাটার্ন হলো মূল অবজেক্টের মত। এটি Shallow Copy তৈরি করে, অর্থাৎ শুধুমাত্র অবজেক্টের রেফারেন্স কপি করা হয়, বাস্তব কনটেন্ট কপি হয় না (যেমন এক্সটেনডেড অবজেক্ট বা নেস্টেড অবজেক্টের ক্ষেত্রে)।
clone() মেথডের ব্যবহার:
- Shallow Copy:
clone()শুধুমাত্র অবজেক্টের প্রথম স্তরের কপি তৈরি করে। এটি যদি একটি অবজেক্টে আরেকটি অবজেক্টের রেফারেন্স থাকে, তবে ক্লোন করা অবজেক্টে ঐ রেফারেন্সের মানও কপি হবে, তবে অবজেক্টের ভেতরের ডেটার কপি হবে না। - Override Required:
clone()মেথডটিObjectক্লাসে ডিফাইন করা হলেও, এটি শুধুমাত্র তখন কাজ করে যখন অবজেক্টের ক্লাসCloneableইন্টারফেসটি ইমপ্লিমেন্ট করে।
clone() মেথডের সিঙ্কট্যাক্স:
protected Object clone() throws CloneNotSupportedException
- protected: এটি
protectedহওয়ায়, ক্লাসগুলো নিজস্ব ক্লোনিং কার্যকলাপের জন্য এটি ব্যবহার করতে পারে, তবে বাইরের ক্লাসে সরাসরি অ্যাক্সেস করা যাবে না। - throws CloneNotSupportedException: যদি কোনো ক্লাস
Cloneableইন্টারফেস ইমপ্লিমেন্ট না করে, তাহলে এই মেথডCloneNotSupportedExceptionছুঁড়ে দেয়।
Cloneable Interface:
Cloneable একটি মার্কার ইন্টারফেস, অর্থাৎ এটি কোনও মেথড ডিফাইন করে না। এর লক্ষ্য হল Java এর ক্লাসগুলোকে ক্লোনযোগ্য (cloneable) হিসেবে চিহ্নিত করা। যদি একটি ক্লাস Cloneable ইন্টারফেস ইমপ্লিমেন্ট করে, তবে ঐ ক্লাসের অবজেক্ট ক্লোন করা যাবে। যদি ক্লাসটি Cloneable ইন্টারফেস ইমপ্লিমেন্ট না করে এবং clone() মেথড কল করা হয়, তবে CloneNotSupportedException আছড়ে পড়বে।
Cloneable ইন্টারফেস ব্যবহার:
Cloneableইন্টারফেস এক ধরনের চুক্তি বা সিগন্যাল যা বলে দেয় যে একটি ক্লাসের অবজেক্ট ক্লোন করা যাবে। এটি ক্লাসের ভিতরে কোনো মেথড ডিফাইন না করলেও শুধুমাত্র একটি চিহ্ন হিসেবে কাজ করে।
clone() মেথড এবং Cloneable Interface এর উদাহরণ:
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter methods
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Override the clone method
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); // Call the clone method of Object class
}
}
public class CloneExample {
public static void main(String[] args) {
try {
// Create an object
Person person1 = new Person("John", 25);
// Clone the object
Person person2 = (Person) person1.clone();
System.out.println("Original Person: " + person1.getName() + ", " + person1.getAge());
System.out.println("Cloned Person: " + person2.getName() + ", " + person2.getAge());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
ব্যাখ্যা:
Personক্লাসটিCloneableইন্টারফেস ইমপ্লিমেন্ট করেছে, যার ফলেclone()মেথডটি সফলভাবে কাজ করতে পারবে।clone()মেথডটিsuper.clone()কল করছে, যা মূলObjectক্লাসেরclone()মেথডকে ব্যবহার করে অবজেক্টের কপি তৈরি করে।person1এর কপি তৈরি করেperson2কে প্রদান করা হয়েছে, এবং পরে তাদের নাম ও বয়স প্রদর্শিত হয়েছে।
আউটপুট:
Original Person: John, 25
Cloned Person: John, 25
Shallow Copy বনাম Deep Copy:
- Shallow Copy:
clone()মেথডটি সাধারণত শ্যালো কপি তৈরি করে। অর্থাৎ যদি কোনো অবজেক্টে অন্য অবজেক্টের রেফারেন্স থাকে, তবে ক্লোনকৃত অবজেক্টে সেই রেফারেন্সের কপি থাকে, কিন্তু ভ্যালুগুলোর কপি থাকে না। - Deep Copy: যদি আপনি পুরো অবজেক্টের কপি করতে চান (অর্থাৎ, ঐ অবজেক্টের ভিতরের সব রেফারেন্সে গিয়েও কপি করতে চান), তাহলে আপনাকে deep cloning এর জন্য ম্যানুয়ালি কোড লিখতে হবে।
Shallow Copy Example:
class Car implements Cloneable {
private String model;
private Engine engine;
public Car(String model, Engine engine) {
this.model = model;
this.engine = engine;
}
public String getModel() {
return model;
}
public Engine getEngine() {
return engine;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone(); // Shallow copy
}
}
class Engine {
private String type;
public Engine(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
public class ShallowCopyExample {
public static void main(String[] args) throws CloneNotSupportedException {
Engine engine = new Engine("V8");
Car car1 = new Car("Toyota", engine);
Car car2 = (Car) car1.clone();
System.out.println(car1.getEngine().getType()); // Output: V8
System.out.println(car2.getEngine().getType()); // Output: V8
// Modifying the engine of car2 will affect car1 as well because both refer to the same Engine object
car2.getEngine().getType();
System.out.println(car1.getEngine().getType()); // Output: modified value of engine type
}
}
এখানে Car ক্লাসের ক্লোনিং একটি shallow copy তৈরি করবে, এবং Engine অবজেক্টে পরিবর্তন করলে তা মূল car1 অবজেক্টকেও প্রভাবিত করবে কারণ তারা একই Engine অবজেক্টের রেফারেন্স শেয়ার করছে।
clone()মেথড একটি অবজেক্টের শ্যালো কপি তৈরি করতে ব্যবহৃত হয়।Cloneableএকটি মার্কার ইন্টারফেস যা Java অবজেক্ট ক্লোনিং সক্ষম করে।- যদি কোনো ক্লাস
Cloneableইন্টারফেস ইমপ্লিমেন্ট না করে, তাহলেclone()মেথড কল করলেCloneNotSupportedExceptionঅ্যাক্সেপশন ছুঁড়ে দেওয়া হবে।
Read more